{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [],
   "source": [
    "# Reference: https://jupyterbook.org/interactive/hiding.html\n",
    "# Use {hide, remove}-{input, output, cell} tags to hiding content\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "%matplotlib inline\n",
    "import ipywidgets as widgets\n",
    "from ipywidgets import interact, interactive, fixed, interact_manual\n",
    "\n",
    "sns.set()\n",
    "sns.set_context('talk')\n",
    "np.set_printoptions(threshold=20, precision=2, suppress=True)\n",
    "pd.set_option('display.max_rows', 7)\n",
    "pd.set_option('display.max_columns', 8)\n",
    "pd.set_option('precision', 2)\n",
    "# This option stops scientific notation for pandas\n",
    "# pd.set_option('display.float_format', '{:.2f}'.format)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [],
   "source": [
    "def df_interact(df, nrows=7, ncols=7):\n",
    "    '''\n",
    "    Outputs sliders that show rows and columns of df\n",
    "    '''\n",
    "    def peek(row=0, col=0):\n",
    "        return df.iloc[row:row + nrows, col:col + ncols]\n",
    "\n",
    "    row_arg = (0, len(df), nrows) if len(df) > nrows else fixed(0)\n",
    "    col_arg = ((0, len(df.columns), ncols)\n",
    "               if len(df.columns) > ncols else fixed(0))\n",
    "    \n",
    "    interact(peek, row=row_arg, col=col_arg)\n",
    "    print('({} rows, {} columns) total'.format(df.shape[0], df.shape[1]))\n",
    "\n",
    "def display_df(df, rows=pd.options.display.max_rows,\n",
    "               cols=pd.options.display.max_columns):\n",
    "    with pd.option_context('display.max_rows', rows,\n",
    "                           'display.max_columns', cols):\n",
    "        display(df)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# PCA using the Singular Value Decomposition"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This section introduces the **singular value decomposition (SVD)**, a tool from linear algebra that computes the principal components of a matrix. We use SVD as a step in **principal component analysis (PCA)**.\n",
    "\n",
    "Why are linear algebra techniques useful for data analysis? Here's one analogy. We use basic algebraic operators like addition and multiplication to summarize one-dimensional data. For example, we can compute the mean and standard deviation of the heights of Data 100 students, a one-dimensional dataset. Linear algebra provides us with matrix operators which generalize algebraic operations to multidimensional data. For instance, we can view matrix multiplication as a more general version of scalar multiplication. Linear algebra operators allow us to summarize and analyze multidimensional data.\n",
    "\n",
    "In data analysis, we often examine data tables using both the domain of interest and linear algebra techniques. For example, we can say that every row of this data table contains the votes of a single congressperson."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [],
   "source": [
    "df = pd.read_csv('vote_pivot.csv', index_col='member')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>515</th>\n",
       "      <th>516</th>\n",
       "      <th>517</th>\n",
       "      <th>518</th>\n",
       "      <th>...</th>\n",
       "      <th>552</th>\n",
       "      <th>553</th>\n",
       "      <th>554</th>\n",
       "      <th>555</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>member</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>A000055</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A000367</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>A000369</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Y000062</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>...</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Y000065</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Z000017</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>441 rows × 41 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "         515  516  517  518  ...  552  553  554  555\n",
       "member                       ...                    \n",
       "A000055    1    0    0    0  ...    0    0    1    0\n",
       "A000367    0    0    0    0  ...    1    1    0    1\n",
       "A000369    1    1    0    0  ...    0    0    1    0\n",
       "...      ...  ...  ...  ...  ...  ...  ...  ...  ...\n",
       "Y000062    1    1    1    1  ...    1    1    1    1\n",
       "Y000065    0    0    0    0  ...    0    0    1    0\n",
       "Z000017    1    1    0    0  ...    0    0    1    0\n",
       "\n",
       "[441 rows x 41 columns]"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This view allows us to answer questions like: \"Were there any bills that were unanimously voted for?\"."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "But we can also view this same table as a 441 x 41 matrix:\n",
    "\n",
    "$$\n",
    "\\mathbf X = \\begin{bmatrix}\n",
    "1 & 0 & \\cdots & 1 & 0 \\\\\n",
    "0 & 0 & \\cdots & 0 & 1 \\\\\n",
    "  &   & \\vdots &   &   \\\\\n",
    "0 & 0 & \\cdots & 1 & 0 \\\\\n",
    "1 & 1 & \\cdots & 1 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Viewing data as a matrix gives us access to the rich library of tools from linear algebra, including the SVD. This allows us to answer another set of questions, such as: \"What patterns of voting emerge from all the votes?\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Singular Value Decomposition\n",
    "\n",
    "The singular value decomposition expresses any $ n \\times d $ matrix $ \\mathbf X $ as a product of three matrices $ \\mathbf U $, $ \\mathbf \\Sigma $, and $ \\mathbf V $:\n",
    "\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\mathbf{X} &= \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top}\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "There are restrictions on $ \\mathbf U $, $ \\mathbf \\Sigma $, and $ \\mathbf V $:\n",
    "\n",
    "1. $ \\mathbf U $ has dimensions $ n \\times n $, $ \\mathbf \\Sigma $ has dimensions $ n \\times d $, and $ \\mathbf V $ has dimensions $ d \\times d $.\n",
    "1. $ \\mathbf U $ and $ \\mathbf V $ are orthogonal matrices. That is, $ \\mathbf U^\\top \\mathbf U = \\mathbf I $ and $ \\mathbf V^\\top \\mathbf V = \\mathbf I $. This also implies that all columns of $ \\mathbf{U} $ and $ \\mathbf{V} $ have magnitude 1 and are mutually orthogonal.\n",
    "1. $ \\mathbf{\\Sigma} $ is a diagonal matrix. That is, all elements in $ \\mathbf{\\Sigma} $ are 0 unless they lie on the diagonal. In addition, the diagonal elements in $ \\mathbf{\\Sigma} $ are arranged from biggest to smallest."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As a simple example, if we have:\n",
    "\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\mathbf{X} = \\begin{bmatrix}\n",
    "1 & 0 \\\\\n",
    "0 & 4 \\\\\n",
    "0 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "\\end{aligned}\n",
    "$$\n",
    "\n",
    "The SVD of $ \\mathbf{X} $ is:\n",
    "\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\mathbf{X}\n",
    "&= \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} \\\\\n",
    "&= \\begin{bmatrix}\n",
    "0 & 1 & 0 \\\\\n",
    "1 & 0 & 0\\\\\n",
    "0 & 0 & 1 \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "4 & 0 \\\\\n",
    "0 & 1 \\\\\n",
    "0 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "0 & 1 \\\\\n",
    "1 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can check that this decomposition reproduces $ \\mathbf{X} $:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0],\n",
       "       [0, 4],\n",
       "       [0, 0]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U = np.array([\n",
    "    [0, 1, 0],\n",
    "    [1, 0, 0],\n",
    "    [0, 0, 1],\n",
    "])\n",
    "S = np.array([\n",
    "    [4, 0],\n",
    "    [0, 1],\n",
    "    [0, 0],\n",
    "])\n",
    "V = np.array([\n",
    "    [0, 1],\n",
    "    [1, 0],\n",
    "])\n",
    "\n",
    "U @ S @ V.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We can also check that the matrices $ \\mathbf U $, $ \\mathbf \\Sigma $, and $ \\mathbf V $ fulfill the requirements of the SVD.\n",
    "\n",
    "First: $ \\mathbf{X} $ has dimensions $ 3 \\times 2 $. $ \\mathbf U $ has dimensions $ 3 \\times 3 $, $ \\mathbf \\Sigma $ has dimensions $ 3 \\times 2 $, and $ \\mathbf V $ has dimensions $ 2 \\times 2 $.\n",
    "\n",
    "Second: $ \\mathbf U $ and $ \\mathbf V $ are orthogonal matrices:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0],\n",
       "       [0, 1, 0],\n",
       "       [0, 0, 1]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U @ U.T"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0],\n",
       "       [0, 1]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "V @ V.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Third: $ \\mathbf \\Sigma $ is diagonal, and its diagonal elements are arranged from greatest to least."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[4, 0],\n",
       "       [0, 1],\n",
       "       [0, 0]])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "S"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Computing the SVD in Python\n",
    "\n",
    "To compute the SVD in Python, we use the `np.linalg.svd` function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0., 1., 0.],\n",
       "        [1., 0., 0.],\n",
       "        [0., 0., 1.]]),\n",
       " array([4., 1.]),\n",
       " array([[0., 1.],\n",
       "        [1., 0.]]))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svd = np.linalg.svd\n",
    "\n",
    "X = np.array([\n",
    "    [1, 0],\n",
    "    [0, 4],\n",
    "    [0, 0]\n",
    "])\n",
    "svd(X)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`np.linalg.svd` returns a tuple of three arrays corresponding to $ \\mathbf{U} $, $ \\mathbf{\\Sigma} $, and $ \\mathbf{V^\\top} $. Notice that the $ \\mathbf{\\Sigma} $ value is one-dimensional numpy array rather than a diagonal matrix, which can cause problems recreating $\\mathbf{X}$ using the return values of `np.linalg.svd`. For convenience, we often use `full_matrices=False` in our call to `np.linalg.svd`, which reduces the dimensions of $ \\mathbf{U} $ or $ \\mathbf{V^\\top} $ to match the dimensions of $ \\mathbf{\\Sigma} $:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0., 1.],\n",
       "        [1., 0.],\n",
       "        [0., 0.]]),\n",
       " array([4., 1.]),\n",
       " array([[0., 1.],\n",
       "        [1., 0.]]))"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "svd(X, full_matrices=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This allows us to use `np.diag` to create the diagonal matrix $ \\mathbf{\\Sigma} $ and reproduce the original $ \\mathbf{X} $:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0.],\n",
       "       [0., 4.],\n",
       "       [0., 0.]])"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U, S, Vt = svd(X, full_matrices=False)\n",
    "U @ np.diag(S) @ Vt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This takes advantage of the fact that an all-zero row in a matrix multiplication can be removed, in this case:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "$$\n",
    "\\begin{aligned}\n",
    "\\mathbf{X}\n",
    "&= \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} \\\\\n",
    "&= \\begin{bmatrix}\n",
    "0 & 1 & 0 \\\\\n",
    "1 & 0 & 0\\\\\n",
    "0 & 0 & 1 \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "4 & 0 \\\\\n",
    "0 & 1 \\\\\n",
    "0 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "0 & 1 \\\\\n",
    "1 & 0 \\\\\n",
    "\\end{bmatrix} \\\\\n",
    "&=\n",
    "\\begin{bmatrix}\n",
    "0 & 1 \\\\\n",
    "1 & 0 \\\\\n",
    "0 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "4 & 0 \\\\\n",
    "0 & 1 \\\\\n",
    "\\end{bmatrix}\n",
    "\\begin{bmatrix}\n",
    "0 & 1 \\\\\n",
    "1 & 0 \\\\\n",
    "\\end{bmatrix}\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note that we select this example for simplicity. As we will soon see, for real datasets the elements of $ \\mathbf{U} $, $ \\mathbf{\\Sigma} $, and $ \\mathbf{V^\\top} $ are rarely integers."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Principal Directions\n",
    "\n",
    "SVD takes a data matrix $ \\mathbf{X} $ and produces the matrix factorization $\\mathbf{X} = \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top}$. This factorization has useful properties that we use to perform dimensionality reduction.\n",
    "\n",
    "First, we examine $ \\mathbf{V^\\top} $. The rows of $ \\mathbf{V^\\top} $ (or equivalently the columns of the untransposed $ \\mathbf{V} $) contain the **principal directions** for the matrix $ \\mathbf{X} $. Consider the following dataset of country-level child mortality and fertility:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mortality</th>\n",
       "      <th>fertility</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Afghanistan</th>\n",
       "      <td>6.82</td>\n",
       "      <td>4.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Albania</th>\n",
       "      <td>1.33</td>\n",
       "      <td>1.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Algeria</th>\n",
       "      <td>2.39</td>\n",
       "      <td>2.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Yemen</th>\n",
       "      <td>5.30</td>\n",
       "      <td>3.89</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zambia</th>\n",
       "      <td>6.16</td>\n",
       "      <td>4.93</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zimbabwe</th>\n",
       "      <td>5.68</td>\n",
       "      <td>3.68</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>183 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             mortality  fertility\n",
       "country                          \n",
       "Afghanistan       6.82       4.48\n",
       "Albania           1.33       1.71\n",
       "Algeria           2.39       2.71\n",
       "...                ...        ...\n",
       "Yemen             5.30       3.89\n",
       "Zambia            6.16       4.93\n",
       "Zimbabwe          5.68       3.68\n",
       "\n",
       "[183 rows x 2 columns]"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "child_data = pd.read_csv('child_data.csv', index_col='country')\n",
    "child_data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To examine the principal directions of this data matrix, we first **center** the data by subtracting the mean of each column."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mortality</th>\n",
       "      <th>fertility</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Afghanistan</th>\n",
       "      <td>3.79</td>\n",
       "      <td>1.70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Albania</th>\n",
       "      <td>-1.70</td>\n",
       "      <td>-1.07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Algeria</th>\n",
       "      <td>-0.64</td>\n",
       "      <td>-0.07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Yemen</th>\n",
       "      <td>2.27</td>\n",
       "      <td>1.11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zambia</th>\n",
       "      <td>3.13</td>\n",
       "      <td>2.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zimbabwe</th>\n",
       "      <td>2.65</td>\n",
       "      <td>0.90</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>183 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             mortality  fertility\n",
       "country                          \n",
       "Afghanistan       3.79       1.70\n",
       "Albania          -1.70      -1.07\n",
       "Algeria          -0.64      -0.07\n",
       "...                ...        ...\n",
       "Yemen             2.27       1.11\n",
       "Zambia            3.13       2.15\n",
       "Zimbabwe          2.65       0.90\n",
       "\n",
       "[183 rows x 2 columns]"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cntr_child = child_data - child_data.mean(axis=0)\n",
    "cntr_child"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then, we compute the SVD and display the values in $ \\mathbf{V^\\top} $."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.93, -0.37],\n",
       "       [-0.37,  0.93]])"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U, S, Vt = svd(cntr_child, full_matrices=False)\n",
    "Vt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We plot the rows of $ \\mathbf{V^\\top} $ as vectors on top of a scatter plot of the original data (we scaled the vectors for presentation). The first row of $ \\mathbf{V^\\top} $ is drawn in red, and the second in purple."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "metadata": {
    "tags": [
     "hide-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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oBAIBAKBXYSgEAgEAoFdhKAQCAQCgV2EoBAIBAKBXYSgEAgEAoFdhKAQCAQCgV2EoBAIBAKBXYSgEAgEAoFdhKCwwunTp3n88ce56qqrGDNmDHPmzGHt2rUO77vjjjsYMWKExb+ioqJu6LXzfP7558ycOZNRo0YxY8YMPv30U7vXNzQ08PTTT5OXl8eYMWP4xS9+wbFjx7qns11AURRWrlzJrFmzGDNmDFOnTuW5557j4kXbNUtWr15t9R0+88wz3djzzqHX6xk1apRF38eMGWPznp74brdt22b1HRn/rVq1yup9PfHdlpaWkpGRQXV1tdnxLVu2cNNNN5Gdnc3VV1/NO++847AtvV7Pyy+/TH5+PtnZ2cydO5fCwkKn+uH39Sg60trays9//nMuXLjA/fffT//+/Vm3bh2//e1vMRgMXH/99Tbv3b9/P/PmzWPmzJlmx4cMGeLpbjvN2rVrefjhh5k3bx6TJk1iw4YNLFq0iODgYK699lqr9zzwwAMUFRXxyCOPEBoayuuvv868efP44osvCA8P7+YROM/bb7/Nyy+/zIIFC7jiiis4evQor776KocPH2b58uVW79m/fz8pKSksW7bM7HhMTEx3dLlLHD16lJaWFpYuXUpqaqrpuCzbXg/2xHebkZHBxx9/bHZMVVV+//vf09jYSH5+vtX7etq7LSsr4+6770av15sd3717NwsXLmTGjBn85je/YdeuXSxbtgxVVVmwYIHN9p599llWrVrFww8/TGJiIu+++y533HEHq1evZuDAgfY7owrMWL9+vTp8+HB17969ZscXLFig3nDDDTbvq66uVocPH65u2rTJ013sElOnTlV/+9vfmh37zW9+o1577bVWr9+xY4fFuGpra9XRo0erf/3rXz3a166gKIqak5OjPvXUU2bHv/jiC3X48OFqSUmJ1fvuvPNOi8+np/DZZ5+pI0eOVBsbG526vqe+W2u899576siRI9UffvjB5jU95d3qdDr1o48+UseMGaPm5uaqw4cPV6uqqkzn58+fr958881m9yxbtky9/PLL1ZaWFqttnjhxQk1LS1NXrFhhOtbS0qJOnjxZffLJJx32SaieOhAaGsott9xCVlaW2fHBgwdTXl5u8779+/cDMGLECI/2ryucOHGC8vJyrrnmGrPj06dPp6ysjBMnTljcs3XrVkJDQ8nLyzMd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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(data=cntr_child, x='mortality', y='fertility')\n",
    "plt.arrow(0, 0, -3 * Vt[0, 0], -3 * Vt[0, 1], width=0.2, color='red')\n",
    "plt.arrow(0, 0, 3 * Vt[1, 0], 3 * Vt[1, 1], width=0.2, color='purple')\n",
    "plt.gca().set_aspect(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Observe that the principal directions of $ \\mathbf{X} $, or the rows of $ \\mathbf{V^\\top} $, seem to align themselves with the direction that the data vary. This is no coincidence: the principal directions of $ \\mathbf{X} $ are precisely the orthogonal directions where $ \\mathbf{X} $ has the greatest variance.\n",
    "\n",
    "As another example, we plot the principal directions for a dataset of human abdomen and density measurements. Again, the first principal direction is drawn in red and the second in purple."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [],
   "source": [
    "#http://jse.amstat.org/datasets/fat.txt\n",
    "fat = (\n",
    "    pd.read_fwf(\"fat.dat.txt\", colspecs = [(17, 21), (23, 29), (35, 37),\n",
    "                                            (39, 45), (48, 53), (73, 77),\n",
    "                                            (80, 85), (88, 93)], header=None,\n",
    "                names = [\"% fat\", \"density\", \"age\", \"weight\", \"height\", \"neck\", \"chest\", \"abdomen\"])\n",
    "    .query('height >= 40')\n",
    ")\n",
    "df = fat[['density', 'abdomen']]\n",
    "df = df.assign(density=df['density'] * 1000)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "df = df - df.mean(axis=0)\n",
    "U, S, Vt = svd(df, full_matrices=False)\n",
    "sns.scatterplot(data=df, x='density', y='abdomen')\n",
    "dirs = -30 * Vt\n",
    "plt.arrow(0, 0, dirs[0, 0], dirs[0, 1], width=2, color='red')\n",
    "plt.arrow(0, 0, dirs[1, 0], dirs[1, 1], width=2, color='purple')\n",
    "plt.gca().set_aspect(1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Principal Component Analysis\n",
    "\n",
    "We can use principal directions to sketch a procedure for dimensionality reduction. First, we find the principal directions of $ \\mathbf{X} $ by centering $ \\mathbf{X} $, then using the SVD. If $ \\mathbf{X} $ has 100 dimensions, this will produce 100 principal directions. Next, we decide how many dimensions we want to reduce to; a common choice is 2. To reduce to 2 dimensions, we keep the first two principal directions and throw out the other 98. Finally, we project the data onto the first two directions. This is **principal component analysis (PCA)**, a method for dimensionality reduction."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "To illustrate PCA, we will reduce the mortality/fertility dataset from two dimensions to one dimension. The data is loaded in the `child_data` DataFrame:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mortality</th>\n",
       "      <th>fertility</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Afghanistan</th>\n",
       "      <td>6.82</td>\n",
       "      <td>4.48</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Albania</th>\n",
       "      <td>1.33</td>\n",
       "      <td>1.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Algeria</th>\n",
       "      <td>2.39</td>\n",
       "      <td>2.71</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Yemen</th>\n",
       "      <td>5.30</td>\n",
       "      <td>3.89</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zambia</th>\n",
       "      <td>6.16</td>\n",
       "      <td>4.93</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zimbabwe</th>\n",
       "      <td>5.68</td>\n",
       "      <td>3.68</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>183 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             mortality  fertility\n",
       "country                          \n",
       "Afghanistan       6.82       4.48\n",
       "Albania           1.33       1.71\n",
       "Algeria           2.39       2.71\n",
       "...                ...        ...\n",
       "Yemen             5.30       3.89\n",
       "Zambia            6.16       4.93\n",
       "Zimbabwe          5.68       3.68\n",
       "\n",
       "[183 rows x 2 columns]"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "child_data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As before, we center `child_data` by subtracting each column by its column mean."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mortality</th>\n",
       "      <th>fertility</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>country</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Afghanistan</th>\n",
       "      <td>3.79</td>\n",
       "      <td>1.70</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Albania</th>\n",
       "      <td>-1.70</td>\n",
       "      <td>-1.07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Algeria</th>\n",
       "      <td>-0.64</td>\n",
       "      <td>-0.07</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Yemen</th>\n",
       "      <td>2.27</td>\n",
       "      <td>1.11</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zambia</th>\n",
       "      <td>3.13</td>\n",
       "      <td>2.15</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Zimbabwe</th>\n",
       "      <td>2.65</td>\n",
       "      <td>0.90</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>183 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "             mortality  fertility\n",
       "country                          \n",
       "Afghanistan       3.79       1.70\n",
       "Albania          -1.70      -1.07\n",
       "Algeria          -0.64      -0.07\n",
       "...                ...        ...\n",
       "Yemen             2.27       1.11\n",
       "Zambia            3.13       2.15\n",
       "Zimbabwe          2.65       0.90\n",
       "\n",
       "[183 rows x 2 columns]"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cntr_child = child_data - child_data.mean(axis=0)\n",
    "cntr_child"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we find the SVD of this data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[-0.1 ,  0.02],\n",
       "        [ 0.05, -0.04],\n",
       "        [ 0.01,  0.02],\n",
       "        ...,\n",
       "        [-0.06,  0.02],\n",
       "        [-0.09,  0.1 ],\n",
       "        [-0.06, -0.02]]),\n",
       " array([43.48,  8.2 ]),\n",
       " array([[-0.93, -0.37],\n",
       "        [-0.37,  0.93]]))"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "U, S, Vt = svd(cntr_child, full_matrices=False)\n",
    "U, S, Vt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Recall that SVD computes $\\mathbf{X} = \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top}$, and the matrix $ \\mathbf{V^\\top} $ contains the two principal directions of $ \\mathbf{X} $. To remove a direction, we simply drop the last row from $ \\mathbf{V^\\top} $:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.93, -0.37]])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Vt[:1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we project the original data points $ \\mathbf{X} $ onto the single principal direction. Since the SVD enforces that principal directions in $ \\mathbf{V^\\top} $ have magnitude one, this a simply a matrix multiplication $ \\mathbf{X} \\mathbf{V} $, after removing a direction from $ \\mathbf{V} $:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 134,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-4.15],\n",
       "       [ 1.98],\n",
       "       [ 0.62],\n",
       "       ...,\n",
       "       [-2.52],\n",
       "       [-3.7 ],\n",
       "       [-2.79]])"
      ]
     },
     "execution_count": 134,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X @ Vt[:1].T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We have successfully performed PCA to reduce $ \\mathbf{X} $ from 2 dimensions to 1. Dimensionality reduction attempts to summarize the data with fewer dimensions while preserving patterns in the data. One way to verify this is to check that points that appear together in the two-dimensional data (scatter plot) also appear together one-dimensional data (rug plot).\n",
    "\n",
    "![pca_svd_one_vs_two.png](pca_svd_one_vs_two.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "tags": [
     "remove-cell"
    ]
   },
   "outputs": [],
   "source": [
    "# For figures\n",
    "# plt.figure(figsize=(4, 1))\n",
    "# one_d = (X @ Vt[:1].T)[:, 0]\n",
    "# sns.rugplot(one_d, height=0.6)\n",
    "# sns.scatterplot(data=cntr_child, x='mortality', y='fertility')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "In practice, we use a simpler method to compute the reduced dimension $ \\mathbf{X} $ which arises from the following equivalence:\n",
    "\n",
    "$$\n",
    "\\begin{aligned}\n",
    "\\mathbf{X} &= \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} \\\\\n",
    "\\mathbf{X} \\mathbf{V} &= \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} \\mathbf{V} & \\text{Right-multiply by $ \\mathbf{V} $} \\\\\n",
    "\\mathbf{X} \\mathbf{V} &= \\mathbf{U} \\mathbf{\\Sigma} & \\text{Since $ \\mathbf{V^\\top} \\mathbf{V} = \\mathbf{I} $} \\\\\n",
    "\\end{aligned}\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "This means that instead of removing rows from $ \\mathbf{V^\\top} $ and then computing $ \\mathbf{X} \\mathbf{V} $ , we can compute $ \\mathbf{U} \\mathbf{\\Sigma} $ and then remove columns until we achieve our desired dimensionality. For this reason, we call the columns of $ \\mathbf{U} \\mathbf{\\Sigma} $ the **principal components** of $ \\mathbf{X} $.\n",
    "\n",
    "To reduce $ \\mathbf{X} $ from 2 to 1 dimension, we can compute the principal components:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 135,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-4.15,  0.19],\n",
       "       [ 1.98, -0.36],\n",
       "       [ 0.62,  0.18],\n",
       "       ...,\n",
       "       [-2.52,  0.2 ],\n",
       "       [-3.7 ,  0.85],\n",
       "       [-2.79, -0.13]])"
      ]
     },
     "execution_count": 135,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pcs = U @ np.diag(S)\n",
    "pcs"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Then drop the rightmost column:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 136,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-4.15],\n",
       "       [ 1.98],\n",
       "       [ 0.62],\n",
       "       ...,\n",
       "       [-2.52],\n",
       "       [-3.7 ],\n",
       "       [-2.79]])"
      ]
     },
     "execution_count": 136,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pcs[:, :1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Notice that this produces the same result as right multiplying $ \\mathbf{X} $ with a truncated $ \\mathbf{V} $:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 137,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-4.15],\n",
       "       [ 1.98],\n",
       "       [ 0.62],\n",
       "       ...,\n",
       "       [-2.52],\n",
       "       [-3.7 ],\n",
       "       [-2.79]])"
      ]
     },
     "execution_count": 137,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X @ Vt[:1].T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "With this, we can describe the final procedure for PCA. To reduce an $ n \\times d $ matrix $ \\mathbf{X} $ to $ k $ dimensions (where $ k < d $), we perform the following steps:\n",
    "\n",
    "1. Center $ \\mathbf{X} $ .\n",
    "2. Use the SVD to find $ \\mathbf{X} = \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} $ .\n",
    "3. Compute the principal components $ \\mathbf{U} \\mathbf{\\Sigma} $ . \n",
    "4. Keep the first $ k $ columns of $ \\mathbf{U} \\mathbf{\\Sigma} $ ."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Rank-k Approximation\n",
    "\n",
    "We can also use PCA to construct a **rank-k approximation** of $ \\mathbf{X} $, which produces a rank $ k $ matrix with the same dimensions as $ \\mathbf{X} $. The rank-k appromixation projects the points in $ \\mathbf{X} $ onto the top $ k $ principal directions. The procedure is similar to that of PCA:\n",
    "\n",
    "1. Center $ \\mathbf{X} $ .\n",
    "2. Use the SVD to find $ \\mathbf{X} = \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} $ .\n",
    "3. Keep the first $ k $ columns of $ \\mathbf{U} \\mathbf{\\Sigma} $ , and the first $ k $ rows of $ \\mathbf{V^\\top} $.\n",
    "4. Compute $ \\mathbf{X} \\approx \\mathbf{U} \\mathbf{\\Sigma} \\mathbf{V^\\top} $ with the reduced $ \\mathbf{U} \\mathbf{\\Sigma} $ and $ \\mathbf{V^\\top} $.\n",
    "\n",
    "The function below provides an implementation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 142,
   "metadata": {},
   "outputs": [],
   "source": [
    "def compute_rank_k_approximation(data, k):\n",
    "    centered = data - data.mean(axis=0)\n",
    "    U, S, Vt = np.linalg.svd(centered, full_matrices = False)\n",
    "    approx = (U @ np.diag(S))[:, :k] @ Vt[:k]\n",
    "    return pd.DataFrame(approx, columns = data.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "As an example, we will compute the rank-1 approximation of the mortality/fertility data:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 144,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>mortality</th>\n",
       "      <th>fertility</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>3.86</td>\n",
       "      <td>1.53</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>-1.84</td>\n",
       "      <td>-0.73</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>-0.58</td>\n",
       "      <td>-0.23</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>180</th>\n",
       "      <td>2.34</td>\n",
       "      <td>0.93</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>181</th>\n",
       "      <td>3.44</td>\n",
       "      <td>1.36</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>182</th>\n",
       "      <td>2.60</td>\n",
       "      <td>1.03</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>183 rows × 2 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "     mortality  fertility\n",
       "0         3.86       1.53\n",
       "1        -1.84      -0.73\n",
       "2        -0.58      -0.23\n",
       "..         ...        ...\n",
       "180       2.34       0.93\n",
       "181       3.44       1.36\n",
       "182       2.60       1.03\n",
       "\n",
       "[183 rows x 2 columns]"
      ]
     },
     "execution_count": 144,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "rank_1 = compute_rank_k_approximation(child_data, 1)\n",
    "rank_1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "We plot the original data in blue and the rank-1 approximation in orange:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 146,
   "metadata": {
    "tags": [
     "remove-input"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7fa88197fd90>"
      ]
     },
     "execution_count": 146,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.scatterplot(data=cntr_child, x='mortality', y='fertility')\n",
    "sns.scatterplot(data=rank_1, x='mortality', y='fertility');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Observe that the rank-1 approximation projects each point in $ \\mathbf{X} $ along the direction of the first principal direction."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Summary\n",
    "\n",
    "This section introduces the singular value decomposition and uses the SVD to perform principal components analysis for dimensionality reduction."
   ]
  }
 ],
 "metadata": {
  "celltoolbar": "Tags",
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
